• Spring Boot 自动配置 = “按需上菜”:读取所有菜单 → 条件过滤 → 注册 Bean。
启动流程 5 步(配时序图)
1. main → SpringApplication.run
2. new SpringApplication
├─ 读取 spring.factories → 拿到所有 *ApplicationContextInitializer*
└─ 推断 web 类型
3. prepareEnvironment → 加载 application.yml
4. refreshContext → 自动配置发生在这里
├─ ConfigurationClassPostProcessor 解析 @Configuration
├─ @ConditionalOnClass/@ConditionalOnMissingBean 过滤
└─ 注册 BeanDefinition → 实例化单例
5. afterRefresh → 启动内嵌 Tomcat → 发布 ApplicationReadyEvent自动配置触发器:
• @EnableAutoConfiguration → AutoConfigurationImportSelector
• 读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
• 条件注解过滤,最终只实例化需要的 Bean。
Bean 扫描:ClassPathBeanDefinitionScanner 用 ASM 读字节码,不加载类,直到真正实例化才 Class.forName。 一句话记忆:
“Spring Boot 先把所有可能用到的菜列成菜单(spring.factories),再用条件注解把不需要的菜划掉,最后只炒真正要吃的菜。”
5️⃣ 优化启动时间 5 阶段
阶段 1:类加载
• spring-context-indexer 生成 META-INF/spring.components → 省 30% 扫描时间
阶段 2:BeanDefinition 加载
• spring.autoconfigure.exclude = org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
阶段 3:实例化
• spring.main.lazy-initialization = true
阶段 4:初始化回调
• 把 @PostConstruct 耗时任务改提交到 TaskExecutor
阶段 5:日志 / 监控
• 关闭 spring.jmx.enabled=false,-Dspring.backgroundpreinitializer.ignore=true
一条命令看耗时:java -XX:+TraceClassLoading -jar app.jar | grep Loaded | wc -l
再用 Spring Boot 2.3+ 的 StartupEndpoint 或 spring.startup.step 事件打点。